ARD2  RC2
Airbag Reference Demonstrator using MPC5604P
MMA51xx.c
Go to the documentation of this file.
00001 
00017 #include "derivative.h"
00018 #include "Compile_Options.h"
00019 #include "CG147.h"
00020 #include "MMA51xx.h"
00021 /*
00022  ******************************************************************************
00023  * Constants
00024  ******************************************************************************
00025  */
00026 
00027 /*
00028  ******************************************************************************
00029  * Globals
00030  ******************************************************************************
00031  */
00032 static uint8_t gu8MMA5100Settings;
00033 static uint8_t gu8MMA5100IndexAdder;
00034 
00035 uint16_t u16fnMMA5100TreatData(uint16_t* pu16SatData,
00036                                uint8_t* pu8ResultArray,
00037                                uint8_t* pu8CurrentIndex,
00038                                uint8_t* pu8IndexAdder,
00039                                uint32_t* pu32AlreadyWritten)
00040 {
00041   /* Locals */
00042   uint16_t u16Status;
00043   
00044   /* Init locals */
00045   u16Status = CLEAR;
00046   
00047   /* Verify that the gathered data is not an accel value */
00048   if((*pu16SatData < MMA5100_UL_FOR_DATA) & *pu16SatData > MMA5100_LL_FOR_DATA)
00049   {
00050     /* Verify that the gathered data is in fact data */
00051     if(*pu16SatData & MMA5100_DATA_INDICATOR)
00052     {
00053       /* We have data */
00054       gu8MMA5100Settings = (uint8_t)(*pu16SatData & MMA5100_CONTENTS_MASK);
00055       switch(*pu8CurrentIndex)
00056       {
00057         case (MMA5100_D1):
00058         {
00059           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D1)) == CLEAR)
00060           {
00061             pu8ResultArray[PROTOCOL] = gu8MMA5100Settings;
00062             *pu32AlreadyWritten |= (BIT0 << MMA5100_D1);
00063           }
00064           else
00065           {
00066             /* Nothing */
00067           }
00068           break;
00069         }
00070         case (MMA5100_D2):
00071         {
00072           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D2)) == CLEAR)
00073           {
00074             pu8ResultArray[N_DATA_BLOCKS] = (gu8MMA5100Settings
00075                 << BITS_IN_NIBBLE);
00076             *pu32AlreadyWritten |= (BIT0 << MMA5100_D2);
00077           }
00078           else
00079           {
00080             /* Nothing */
00081           }
00082           break;
00083         }
00084         case (MMA5100_D3):
00085         {
00086           
00087           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D3)) == CLEAR)
00088           {
00089             pu8ResultArray[N_DATA_BLOCKS] &= 0xF0u;
00090             pu8ResultArray[N_DATA_BLOCKS] |= gu8MMA5100Settings;
00091             *pu32AlreadyWritten |= (BIT0 << MMA5100_D3);
00092           }
00093           else
00094           {
00095             /* Nothing */
00096           }
00097           break;
00098         }
00099         case (MMA5100_D4):
00100         {
00101           
00102           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D4)) == CLEAR)
00103           {
00104             pu8ResultArray[MANUFACTURER] = (gu8MMA5100Settings
00105                 << BITS_IN_NIBBLE);
00106             *pu32AlreadyWritten |= (BIT0 << MMA5100_D4);
00107           }
00108           else
00109           {
00110             /* Nothing */
00111           }
00112           break;
00113         }
00114         case (MMA5100_D5):
00115         {
00116           
00117           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D5)) == CLEAR)
00118           {
00119             pu8ResultArray[MANUFACTURER] &= 0xF0u;
00120             pu8ResultArray[MANUFACTURER] |= gu8MMA5100Settings;
00121             *pu32AlreadyWritten |= (BIT0 << MMA5100_D5);
00122           }
00123           else
00124           {
00125             /* Nothing */
00126           }
00127           break;
00128         }
00129         case (MMA5100_D6):
00130         {
00131           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D6)) == CLEAR)
00132           {
00133             pu8ResultArray[SENSOR_TYPE]
00134                 = (gu8MMA5100Settings << BITS_IN_NIBBLE);
00135             *pu32AlreadyWritten |= (BIT0 << MMA5100_D6);
00136           }
00137           else
00138           {
00139             /* Nothing */
00140           }
00141           break;
00142         }
00143         case (MMA5100_D7):
00144         {
00145           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D7)) == CLEAR)
00146           {
00147             pu8ResultArray[SENSOR_TYPE] &= 0xF0u;
00148             pu8ResultArray[SENSOR_TYPE] |= gu8MMA5100Settings;
00149             *pu32AlreadyWritten |= (BIT0 << MMA5100_D7);
00150           }
00151           else
00152           {
00153             /* Nothing */
00154           }
00155           break;
00156         }
00157         case (MMA5100_D8):
00158         {
00159           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D8)) == CLEAR)
00160           {
00161             pu8ResultArray[AXIS] = gu8MMA5100Settings;
00162             *pu32AlreadyWritten |= (BIT0 << MMA5100_D8);
00163           }
00164           else
00165           {
00166             /* Nothing */
00167           }
00168           break;
00169         }
00170         case (MMA5100_D9):
00171         {
00172           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D9)) == CLEAR)
00173           {
00174             pu8ResultArray[RANGE] = gu8MMA5100Settings;
00175             *pu32AlreadyWritten |= (BIT0 << MMA5100_D9);
00176           }
00177           else
00178           {
00179             /* Nothing */
00180           }
00181           break;
00182         }
00183         case (MMA5100_D10):
00184         {
00185           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D10)) == CLEAR)
00186           {
00187             pu8ResultArray[DEVCFG2] = (gu8MMA5100Settings << BITS_IN_NIBBLE);
00188             *pu32AlreadyWritten |= (BIT0 << MMA5100_D10);
00189           }
00190           else
00191           {
00192             /* Nothing */
00193           }
00194           break;
00195         }
00196         case (MMA5100_D11):
00197         {
00198           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D11)) == CLEAR)
00199           {
00200             pu8ResultArray[DEVCFG2] &= 0xF0u;
00201             pu8ResultArray[DEVCFG2] |= gu8MMA5100Settings;
00202             *pu32AlreadyWritten |= (BIT0 << MMA5100_D11);
00203           }
00204           else
00205           {
00206             /* Nothing */
00207           }
00208           break;
00209         }
00210         case (MMA5100_D12):
00211         {
00212           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D12)) == CLEAR)
00213           {
00214             pu8ResultArray[PRODUCT_REVISION] = (gu8MMA5100Settings
00215                 << BITS_IN_NIBBLE);
00216             *pu32AlreadyWritten |= (BIT0 << MMA5100_D12);
00217           }
00218           else
00219           {
00220             /* Nothing */
00221           }
00222           break;
00223         }
00224         case (MMA5100_D13):
00225         {
00226           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D13)) == CLEAR)
00227           {
00228             pu8ResultArray[PRODUCT_REVISION] &= 0xF0u;
00229             pu8ResultArray[PRODUCT_REVISION] |= gu8MMA5100Settings;
00230             *pu32AlreadyWritten |= (BIT0 << MMA5100_D13);
00231           }
00232           else
00233           {
00234             /* Nothing */
00235           }
00236           break;
00237         }
00238         case (MMA5100_D14):
00239         {
00240           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D14)) == CLEAR)
00241           {
00242             pu8ResultArray[DEVCFG6] = gu8MMA5100Settings;
00243             *pu32AlreadyWritten |= (BIT0 << MMA5100_D14);
00244           }
00245           else
00246           {
00247             /* Nothing */
00248           }
00249           break;
00250         }
00251         case (MMA5100_D15):
00252         {
00253           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D15)) == CLEAR)
00254           {
00255             pu8ResultArray[PROD_DATE_1]
00256                 = (gu8MMA5100Settings << BITS_IN_NIBBLE);
00257             *pu32AlreadyWritten |= (BIT0 << MMA5100_D15);
00258           }
00259           else
00260           {
00261             /* Nothing */
00262           }
00263           break;
00264         }
00265         case (MMA5100_D16):
00266         {
00267           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D16)) == CLEAR)
00268           {
00269             pu8ResultArray[PROD_DATE_1] &= 0xF0u;
00270             pu8ResultArray[PROD_DATE_1] |= gu8MMA5100Settings;
00271             *pu32AlreadyWritten |= (BIT0 << MMA5100_D16);
00272           }
00273           else
00274           {
00275             /* Nothing */
00276           }
00277           break;
00278         }
00279         case (MMA5100_D17):
00280         {
00281           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D17)) == CLEAR)
00282           {
00283             pu8ResultArray[PROD_DATE_2]
00284                 = (gu8MMA5100Settings << BITS_IN_NIBBLE);
00285             *pu32AlreadyWritten |= (BIT0 << MMA5100_D17);
00286           }
00287           else
00288           {
00289             /* Nothing */
00290           }
00291           break;
00292         }
00293         case (MMA5100_D18):
00294         {
00295           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D18)) == CLEAR)
00296           {
00297             pu8ResultArray[PROD_DATE_2] &= 0xF0u;
00298             pu8ResultArray[PROD_DATE_2] |= gu8MMA5100Settings;
00299             *pu32AlreadyWritten |= (BIT0 << MMA5100_D18);
00300           }
00301           else
00302           {
00303             /* Nothing */
00304           }
00305           break;
00306         }
00307         case (MMA5100_D19):
00308         {
00309           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D19)) == CLEAR)
00310           {
00311             pu8ResultArray[SN0] = (gu8MMA5100Settings << BITS_IN_NIBBLE);
00312             *pu32AlreadyWritten |= (BIT0 << MMA5100_D19);
00313           }
00314           else
00315           {
00316             /* Nothing */
00317           }
00318           break;
00319         }
00320         case (MMA5100_D20):
00321         {
00322           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D20)) == CLEAR)
00323           {
00324             pu8ResultArray[SN0] &= 0xF0u;
00325             pu8ResultArray[SN0] |= gu8MMA5100Settings;
00326             *pu32AlreadyWritten |= (BIT0 << MMA5100_D20);
00327           }
00328           else
00329           {
00330             /* Nothing */
00331           }
00332           break;
00333         }
00334         case (MMA5100_D21):
00335         {
00336           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D21)) == CLEAR)
00337           {
00338             pu8ResultArray[SN1] = (gu8MMA5100Settings << BITS_IN_NIBBLE);
00339             *pu32AlreadyWritten |= (BIT0 << MMA5100_D21);
00340           }
00341           else
00342           {
00343             /* Nothing */
00344           }
00345           break;
00346         }
00347         case (MMA5100_D22):
00348         {
00349           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D22)) == CLEAR)
00350           {
00351             pu8ResultArray[SN1] &= 0xF0u;
00352             pu8ResultArray[SN1] |= gu8MMA5100Settings;
00353             *pu32AlreadyWritten |= (BIT0 << MMA5100_D22);
00354           }
00355           else
00356           {
00357             /* Nothing */
00358           }
00359           break;
00360         }
00361         case (MMA5100_D23):
00362         {
00363           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D23)) == CLEAR)
00364           {
00365             pu8ResultArray[SN2] = (gu8MMA5100Settings << BITS_IN_NIBBLE);
00366             *pu32AlreadyWritten |= (BIT0 << MMA5100_D23);
00367           }
00368           else
00369           {
00370             /* Nothing */
00371           }
00372           break;
00373         }
00374         case (MMA5100_D24):
00375         {
00376           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D24)) == CLEAR)
00377           {
00378             pu8ResultArray[SN2] &= 0xF0u;
00379             pu8ResultArray[SN2] |= gu8MMA5100Settings;
00380             *pu32AlreadyWritten |= (BIT0 << MMA5100_D24);
00381           }
00382           else
00383           {
00384             /* Nothing */
00385           }
00386           break;
00387         }
00388         case (MMA5100_D25):
00389         {
00390           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D25)) == CLEAR)
00391           {
00392             pu8ResultArray[SN3] = (gu8MMA5100Settings << BITS_IN_NIBBLE);
00393             *pu32AlreadyWritten |= (BIT0 << MMA5100_D25);
00394           }
00395           else
00396           {
00397             /* Nothing */
00398           }
00399           break;
00400         }
00401         case (MMA5100_D26):
00402         {
00403           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D26)) == CLEAR)
00404           {
00405             pu8ResultArray[SN3] &= ((uint8_t)0xF0u);
00406             pu8ResultArray[SN3] |= gu8MMA5100Settings;
00407             *pu32AlreadyWritten |= (BIT0 << MMA5100_D26);
00408           }
00409           else
00410           {
00411             /* Nothing */
00412           }
00413           break;
00414         }
00415         case (MMA5100_D27):
00416         {
00417           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D27)) == CLEAR)
00418           {
00419             pu8ResultArray[INIT_RAW_OFFSET] = gu8MMA5100Settings;
00420             *pu32AlreadyWritten |= (BIT0 << MMA5100_D27);
00421           }
00422           else
00423           {
00424             /* Nothing */
00425           }
00426           break;
00427         }
00428         case (MMA5100_D28):
00429         {
00430           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D28)) == CLEAR)
00431           {
00432             pu8ResultArray[INIT_RAW_OFFSET] &= ((uint8_t)0x0Fu);
00433             pu8ResultArray[INIT_RAW_OFFSET] |= (gu8MMA5100Settings
00434                 << BITS_IN_NIBBLE);
00435             *pu32AlreadyWritten |= (BIT0 << MMA5100_D28);
00436           }
00437           else
00438           {
00439             /* Nothing */
00440           }
00441           break;
00442         }
00443         case (MMA5100_D29):
00444         {
00445           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D29)) == CLEAR)
00446           {
00447             pu8ResultArray[COMBINED_OFFSET_SELF_TEST] = gu8MMA5100Settings;
00448             *pu32AlreadyWritten |= (BIT0 << MMA5100_D29);
00449           }
00450           else
00451           {
00452             /* Nothing */
00453           }
00454           break;
00455         }
00456         case (MMA5100_D30):
00457         {
00458           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D30)) == CLEAR)
00459           {
00460             pu8ResultArray[AVG_SELF_TEST] = gu8MMA5100Settings;
00461             *pu32AlreadyWritten |= (BIT0 << MMA5100_D30);
00462           }
00463           else
00464           {
00465             /* Nothing */
00466           }
00467           break;
00468         }
00469         case (MMA5100_D31):
00470         {
00471           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D31)) == CLEAR)
00472           {
00473             pu8ResultArray[AVG_SELF_TEST] &= ((uint8_t)0x0Fu);
00474             pu8ResultArray[AVG_SELF_TEST] |= (gu8MMA5100Settings
00475                 << BITS_IN_NIBBLE);
00476             *pu32AlreadyWritten |= (BIT0 << MMA5100_D31);
00477           }
00478           else
00479           {
00480             /* Nothing */
00481           }
00482           break;
00483         }
00484         case (MMA5100_D32):
00485         {
00486           if((*pu32AlreadyWritten & (BIT0 << MMA5100_D32)) == CLEAR)
00487           {
00488             pu8ResultArray[DEVCFG1] = gu8MMA5100Settings;
00489             *pu32AlreadyWritten |= (BIT0 << MMA5100_D32);
00490           }
00491           else
00492           {
00493             /* Nothing */
00494           }
00495           break;
00496         }
00497         default:
00498         {
00499           u16Status = MMA5100_COMMAND_NOT_RECOGNIZED;
00500           break;
00501         }
00502       }
00503     }
00504     else
00505     {
00506       /* This is an index. Let's store it. */
00507       *pu8CurrentIndex = ((uint8_t)(*pu16SatData & MMA5100_CONTENTS_MASK)
00508           + *pu8IndexAdder);
00509       
00510       /* Remember if we need to go to the second page */
00511       if(*pu8CurrentIndex == MMA5100_D16)
00512       {
00513         *pu8IndexAdder = MMA5100_D17;
00514       }
00515       else
00516       {
00517         /* Nothing */
00518       }
00519     }
00520   }
00521   else
00522   {
00523     /* This is not data; it's a status word */
00524     switch(*pu16SatData)
00525     {
00526       case (MMA5100_SENSOR_DEFECT):
00527       {
00528         u16Status = MMA5100_SENSOR_DEFECT_STATUS;
00529         break;
00530       }
00531       case (MMA5100_SENSOR_BUSY):
00532       {
00533         u16Status = MMA5100_SENSOR_BUSY_STATUS;
00534         break;
00535       }
00536       case (MMA5100_SENSOR_READY):
00537       {
00538         u16Status = MMA5100_SENSOR_READY_STATUS;
00539         break;
00540       }
00541       case (MMA5100_SENSOR_READY_UNLOCKED):
00542       {
00543         u16Status = MMA5100_SENSOR_READY_UNLOCKED_STATUS;
00544         break;
00545       }
00546       default:
00547       {
00548         u16Status = MMA5100_COMMAND_NOT_RECOGNIZED;
00549         break;
00550       }
00551     }
00552     
00553   }
00554   
00555   return (u16Status);
00556 }
00557 /*
00558  ******************************************************************************
00559  *
00560  *  End of file.
00561  *
00562  ******************************************************************************
00563  */